﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CreatingObjects3d
{
    //Hereda de la clase padre Objeto
    [Serializable()]
    class ObjetoCaja : Objeto
    {
        //Atributos privados de la clase        
        protected float ancho;
        protected float alto;
        protected float profundo;

        /// <summary>
        /// Constructor principal para un objeto de tipo caja.
        /// Hay que introducir los valores para la medida de la caja.
        ///  
        /// </summary>
        /// <param name="vAlto"></param>
        /// <param name="vAncho"></param>
        /// <param name="vProfundo"></param>
        public ObjetoCaja(float vAlto, float vAncho, float vProfundo)
        {            
            base.tipoObjeto = "CAJA"; //Atributo de la clase padre
            base.nombreObjeto = "CAJA";
            alto = vAlto;
            ancho = vAncho;
            profundo = vProfundo;
            base.colorObjeto = System.Drawing.Color.FromArgb(255, 255, 255);            
            base.escalaX = 1;
            base.escalaY = 1;
            base.escalaZ = 1;
            base.anguloRotacion = 0;
            base.ejeRotacion = 'x';
            base.colorInterior = System.Drawing.Color.FromArgb(255, 255, 255);
            base.colorReflejo = System.Drawing.Color.FromArgb(255, 255, 255);            
            base.reflejoLuzAmbiental = 0;
            base.brillo = 0;
            base.transparencia = 0;
            base.rutaImagen = "";
            base.RutaImgagenOriginal = "";
        }

        public ObjetoCaja(float vAlto, float vAncho, float vProfundo, int numero)
        {            
            base.tipoObjeto = "CAJA"; //Atributo de la clase padre
            base.nombreObjeto = "CAJA" + numero;
            alto = vAlto;
            ancho = vAncho;
            profundo = vProfundo;
            base.colorObjeto = System.Drawing.Color.FromArgb(255, 255, 255);
            base.escalaX = 1;
            base.escalaY = 1;
            base.escalaZ = 1;
            base.anguloRotacion = 0;
            base.ejeRotacion = 'x';
            base.colorInterior = System.Drawing.Color.FromArgb(255, 255, 255);
            base.colorReflejo = System.Drawing.Color.FromArgb(255, 255, 255);
            base.reflejoLuzAmbiental = 0;
            base.brillo = 0;
            base.transparencia = 0;
            base.rutaImagen = "";
            base.RutaImgagenOriginal = "";
        }

        /// <summary>
        /// Introduce nuevas medidas para la caja.
        /// </summary>
        /// <param name="vAncho"></param>
        /// <param name="vAlto"></param>
        /// <param name="vProdundo"></param>
        public void setMedidas(float vAncho, float vAlto, float vProdundo)
        {
            ancho = vAncho;
            alto = vAlto;
            profundo = vProdundo;
        }

        /// <summary>
        /// Devuelve las medidas de la caja en una array float(ancho, alto, profundo).
        /// </summary>
        /// <returns></returns>
        public float[] getMedidas()
        {
            float[] arrayMedidas = new float[3];
            arrayMedidas[0] = ancho;
            arrayMedidas[1] = alto;
            arrayMedidas[2] = profundo;
            return arrayMedidas;
        }

        public override string ToString()
        {
            String codigo;
            if (base.rutaImagen.Equals(""))
            {
                codigo = "Transform { translation" + String.Format(" {0} {1} {2} ", base.posicionX, base.posicionY, base.posicionZ);
                if (base.ejeRotacion == 'X')
                {
                    codigo += String.Format("rotation 1 0 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Y')
                {
                    codigo += String.Format("rotation 0 1 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Z')
                {
                    codigo += String.Format("rotation 0 0 1 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else
                {
                    codigo += String.Format("rotation 1 0 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                codigo += String.Format("scale {0} {1} {2} ", base.escalaX, base.escalaY, base.escalaZ);
                codigo += "children	[ Shape{ appearance Appearance{	material Material { ";
                codigo += String.Format("diffuseColor {0} {1} {2} ", base.colorObjeto.R / 255f, base.colorObjeto.G / 255f, base.colorObjeto.B / 255f);
                codigo += String.Format("emissiveColor {0} {1} {2} ", base.colorInterior.R / 255f, base.colorInterior.G / 255f, base.colorInterior.B / 255f);
                codigo += String.Format("specularColor {0} {1} {2} ", base.colorReflejo.R / 255f, base.colorReflejo.G / 255f, base.colorReflejo.B / 255f);
                codigo += String.Format("ambientIntensity {0} ", base.reflejoLuzAmbiental);
                codigo += String.Format("shininess {0} ", base.brillo);
                codigo += String.Format("transparency {0} ", base.transparencia);
                codigo += "} } geometry Box{ ";
                codigo += String.Format("size {0} {1} {2} ", ancho, alto, profundo);
                codigo += "} } ] }";
            }
            else
            {
                codigo = "Transform { translation" + String.Format(" {0} {1} {2} ", base.posicionX, base.posicionY, base.posicionZ);
                if (base.ejeRotacion == 'X')
                {
                    codigo += String.Format("rotation 1 0 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Y')
                {
                    codigo += String.Format("rotation 0 1 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else if (base.ejeRotacion == 'Z')
                {
                    codigo += String.Format("rotation 0 0 1 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                else
                {
                    codigo += String.Format("rotation 0 0 0 {0} ", (base.anguloRotacion * Math.PI) / 180);
                }
                codigo += String.Format("scale {0} {1} {2} ", base.escalaX, base.escalaY, base.escalaZ);
                codigo += "children	[ Shape{ appearance Appearance{	material Material { ";
                codigo += String.Format("transparency {0} ", base.transparencia);
                codigo += "} texture ImageTexture { ";
                codigo += String.Format("url \"{0}\"  ", base.Imagen);
                if (repetirImagenHorizontal)
                {
                    codigo += "repeatS true ";
                }
                else
                {
                    codigo += "repeatS false ";
                }
                if (repetirImagenVertical)
                {
                    codigo += "repeatT true ";
                }
                else
                {
                    codigo += "repeatT false ";
                }
                codigo += "} } geometry Box{ ";
                codigo += String.Format("size {0} {1} {2} ", ancho, alto, profundo);
                codigo += "} } ] }";
            }
            codigo = codigo.Replace(",", ".");
            return codigo;
        }
    }
}

/*
Transform
{
	translation 0 -1 0      
    rotation 0  0  0  0 
    scale 0  0  0 
	children
	[	
	Shape{  
		appearance Appearance{  
			material Material {
								diffuseColor 0.20 0.4 0.19
								emissiveColor 0.20 0.3 0.19
                                specularColor 0 0 0
                                ambientIntensity 0
                                shininess 0
                                transparency 0  
								}  
		   }  
			geometry Box{  
			  size 2 0.5 3
		   }	   
		}
	]
}
  
size:
Las dimensiones que se manejan en VRML son dimensiones abstractas pero lo normal es suponer que la unidad de medida es el metro. 
De esta forma, en el ejemplo anterior estaríamos definiendo una caja de 2 metros de ancho, 0.5 metros de alto y 3 metros de profundidad. 
 
 texture ImageTexture{   
    url            "direccion_URL"   
    repeatS     valor_lógico   
    repeatT    valor_lógico   
}
  
 
 */
